package com.atwbj.langchain4jbeta3learndemo.config;

/**
 * @description:
 * @author: wbj
 * @create: 2025-07-21 10:07
 **/

import com.atwbj.langchain4jbeta3learndemo.listener.TestChatModelListener;
import dev.langchain4j.community.model.dashscope.QwenChatModel;
import dev.langchain4j.community.model.dashscope.WanxImageModel;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.chat.listener.ChatModelListener;
import dev.langchain4j.model.openai.OpenAiChatModel;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.time.Duration;
import java.util.List;

/**
 * 同一个系统中，同时使用多个模型，需要使用不同的ChatModel实例，@Bean指定实例名称，方便获取
 *
 * @Description: 知识出处 https://docs.langchain4j.dev/get-started
 */
@Configuration
public class LLMConfig {

    @Value("${alibaba.ai.model.name}")
    private String qwenAiModelName;
    @Value("${alibaba.ai.model.base-url}")
    private String qwenAiBaseUrl;

    @Value("${deepseek.ai.model.name}")
    private String deepSeekAiModelName;
    @Value("${deepseek.ai.model.base-url}")
    private String deepSeekBaseUrl;


    @Value("${alibaba.ai.image.model.name}")
    private String qwenVlMax;

    @Autowired
    private ChatModelListener chatModelListener;

    /**
     * @Description: 知识出处，https://api-docs.deepseek.com/zh-cn/
     */
    @Bean(name = "deepseek")
    public ChatLanguageModel chatModelDeepSeek() {
        return
                OpenAiChatModel.builder()
                        // 从系统环境变量中获取deepseek的API密钥（api-key）
                        .apiKey(System.getenv("deepSeekApiKey"))
                        .modelName(deepSeekAiModelName)
                        .baseUrl(deepSeekBaseUrl)
                        .logRequests(true)//必须在配置文件中加上logging.level.dev.langchain4j = DEBUG
                        .logResponses(true)
                        .listeners(List.of(chatModelListener))
                        //.listeners(List.of(new TestChatModelListener()))
                        .build();
    }


    @Bean(name = "qwen")
    public ChatLanguageModel chatModelQwen() {
        // 使用OpenAiChatModel的构建器模式来创建和配置ChatModel实例
        return OpenAiChatModel.builder()
                // 从系统环境变量中获取阿里云通义千问的API密钥（api-key）
                .apiKey(System.getenv("aliQwen-api"))
                // 指定使用的模型为"qwen-plus"，必须是官方提供的英文code
                .modelName(qwenAiModelName)
                // 设置与阿里云API兼容的基础URL
                .baseUrl(qwenAiBaseUrl)
                .logRequests(true)//必须在配置文件中加上logging.level.dev.langchain4j = DEBUG
                .logResponses(true)
                .listeners(List.of(chatModelListener))
                .maxRetries(5)
                //超过10s就超时
                .timeout(Duration.ofSeconds(10L))
                //.listeners(List.of(new TestChatModelListener()))
                // 完成构建并返回配置好的ChatModel实例
                .build();
    }

    //图像处理的模型qwen-vl-max
    @Bean(name = "qwen-vl-max")
    public ChatLanguageModel chatModelQwenVlMax() {
        return OpenAiChatModel.builder()
                .apiKey(System.getenv("aliQwen-api"))
                .modelName(qwenVlMax)
                .baseUrl(qwenAiBaseUrl)
                .logRequests(true)//必须在配置文件中加上logging.level.dev.langchain4j = DEBUG
                .logResponses(true)
                //.listeners(List.of(chatModelListener))
                .timeout(Duration.ofSeconds(800L))
                .build();
    }

    /**
     * @Description: 测试通义万象来实现图片生成，
     * 官网说明：https://help.aliyun.com/zh/model-studio/text-to-image
     * @Auther: zzyybs@126.com
     */
    //
    @Bean
    public WanxImageModel wanxImageModel() {
        //WanxImageModel是dev.langchain4j.community.model.dashscope包里的。这里baseUrl有默认值，不需要写，底层代码中也没暴露。
        return WanxImageModel.builder()
                .apiKey(System.getenv("aliQwen-api"))
                .modelName("wanx2.1-t2i-turbo")
                .build();
    }

    @Bean
    public QwenChatModel wanxImageModel2() {
        System.out.println("aaa");
        System.out.println("master分支xx");
        return QwenChatModel.builder()
                .apiKey(System.getenv("aliQwen-api"))
                .modelName("qwen-plus")
                .build();
    }


}


